package com.time.admin.application.controller;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.google.common.base.Preconditions;
import com.time.admin.application.converter.PostDTOConverter;
import com.time.admin.application.dto.PostDTO;
import com.time.admin.common.entity.PageResult;
import com.time.admin.domain.entity.PostBO;
import com.time.admin.domain.service.AdminPostDomainService;
import com.time.auth.entity.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 文章管理控制层类
 *
 * @author: HuangQi
 * @date: Created in 9:51 2025/11/4
 * @description: 文章管理控制层
 */
@Slf4j
@RestController
@RequestMapping("/admin/post/")
public class PostController {

    @Autowired
    private AdminPostDomainService adminPostDomainService;

    /**
     * 新增文章
     *
     * @param postDTO 新增文章信息
     * @return 新增结果
     */
    @PostMapping("add")
    public Result<Boolean> add(@RequestBody PostDTO postDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.PostController.add.dto:{}", postDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(postDTO.getTitle(), "文章的标题不能为空");
            Preconditions.checkNotNull(postDTO.getSummary(), "文章的摘要不能为空");
            Preconditions.checkNotNull(postDTO.getContent(), "文章的内容不能为空");
            Preconditions.checkNotNull(postDTO.getStatus(), "文章的状态不能为空");
            Preconditions.checkNotNull(postDTO.getCategoryName(), "文章的分类不能为空");
            Preconditions.checkArgument(!CollectionUtils.isEmpty(postDTO.getTagNameList()), "文章的标签不能为空");

            // 调用领域层
            PostBO postBO = PostDTOConverter.INSTANCE.convertDTOToBO(postDTO);
            Boolean addResult = adminPostDomainService.add(postBO);

            // 返回结果
            return Result.ok(addResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.PostController.add.error:{}", e.getMessage(), e);
            return Result.fail("管理模块新增文章失败");
        }
    }

    /**
     * 更新文章
     *
     * @param postDTO 更新文章的信息
     * @return 更新结果
     */
    @PostMapping("update")
    public Result<Boolean> update(@RequestBody PostDTO postDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.PostController.update.dto:{}", postDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(postDTO.getPostId(), "文章的id不能为空");
            Preconditions.checkNotNull(postDTO.getTitle(), "文章的标题不能为空");
            Preconditions.checkNotNull(postDTO.getSummary(), "文章的摘要不能为空");
            Preconditions.checkNotNull(postDTO.getContent(), "文章的内容不能为空");
            Preconditions.checkNotNull(postDTO.getStatus(), "文章的状态不能为空");
            Preconditions.checkNotNull(postDTO.getCategoryName(), "文章的分类不能为空");
            Preconditions.checkArgument(!CollectionUtils.isEmpty(postDTO.getTagNameList()), "文章的标签不能为空");

            // 调用领域层
            PostBO postBO = PostDTOConverter.INSTANCE.convertDTOToBO(postDTO);
            Boolean updateResult = adminPostDomainService.update(postBO);

            // 返回结果
            return Result.ok(updateResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.PostController.update.error:{}", e.getMessage(), e);
            return Result.fail("管理模块更新文章失败");
        }
    }

    /**
     * 删除文章
     *
     * @param id 删除文章的id
     * @return 删除结果
     */
    @PostMapping("delete/{id}")
    public Result<Boolean> delete(@PathVariable("id") Long id) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.PostController.delete.id:{}", id);
            }
            // 参数校验
            Preconditions.checkNotNull(id, "文章的id不能为空");

            // 调用领域层
            Boolean deleteResult = adminPostDomainService.delete(id);

            // 返回结果
            return Result.ok(deleteResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.PostController.delete.error:{}", e.getMessage(), e);
            return Result.fail("管理模块删除文章失败");
        }
    }

    /**
     * 分页查询文章基本信息
     *
     * @param postDTO 筛选文章信息
     * @return 分页文章基本信息结果
     */
    @PostMapping("queryAll")
    public Result<PageResult<PostDTO>> queryAllPost(@RequestBody PostDTO postDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.PostController.queryAllPost.dto: {}", postDTO);
            }

            // 调用领域层
            PostBO postBO = PostDTOConverter.INSTANCE.convertDTOToBO(postDTO);
            PageResult<PostBO> infoBOPageResult = adminPostDomainService.queryAllPost(postBO);

            // 返回结果
            PageResult<PostDTO> infoDTOPageResult = PostDTOConverter.INSTANCE.convertBOPageToDTOPage(infoBOPageResult);
            return Result.ok(infoDTOPageResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.PostController.queryAllPost.error:{}", e.getMessage(), e);
            return Result.fail("管理模块分页获取所有文章失败");
        }
    }

    /**
     * 获取单个文章
     *
     * @param id 文章的id
     * @return 文章详细信息
     */
    @PostMapping("query/{id}")
    public Result<PostDTO> queryPost(@PathVariable("id") Long id) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.PostController.queryPost.id: {}", id);
            }
            // 参数校验
            Preconditions.checkNotNull(id, "文章的id不能为空");

            // 调用领域层
            PostBO postBO = adminPostDomainService.queryPost(id);

            // 返回结果
            PostDTO postDTO = PostDTOConverter.INSTANCE.convertBOToDTO(postBO);
            return Result.ok(postDTO);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.PostController.queryPost.error:{}", e.getMessage(), e);
            return Result.fail("管理模块分页获取单个文章失败");
        }
    }
}
